package br.org.acessobrasil.portal.vista;

import java.util.List;

import org.w3c.css.parser.CssError;
import org.w3c.css.util.Warning;

import br.org.acessobrasil.ases.ferramentas_de_reparo.modelo.AvaliacaoCSS;
import br.org.acessobrasil.ases.nucleo.adapters.entidade.ArmazenaErroOuAviso;
import br.org.acessobrasil.commons.StringUtils;
import br.org.acessobrasil.portal.modelo.ErrosRegra;
import br.org.acessobrasil.portal.modelo.RelatorioAcessibilidade;
/**
 * Gera o relatorio de erros do ASES
 * @author Fabio Issamu Oshiro
 *
 */
public class GeraRelatorio {
	public static String INI_TABELA="<table id=\"tabelaErros2\">"+
				"<tr>" +
					"<td colspan=\"4\" class=\"topo1\"> Pontos de verifica&ccedil;&atilde;o / Recomenda&ccedil;&atilde;o </td>"+
				"</tr>"+
				"<tr>"+
					"<td colspan=\"2\" class=\"topo2\"> Pontos de verifica&ccedil;&atilde;o / Recomenda&ccedil;&atilde;o </td>"+
					"<td class=\"topo2\"> Ocorr&ecirc;ncia(s)</td>"+
					"<td class=\"topo2\"> Linha(s) </td>"+
				"</tr>";
	public static String INI_TABELA_CSS="<table id=\"tabelaErros2\">"+
				"<tr>"+
					"<td class=\"topo2\"> Linha(s) </td>"+
					"<td class=\"topo2\"> Mensagem</td>"+
				"</tr>";
	public static String CAB_AVISOS = "<p><img src=\"images/alert.gif\" alt=\"alertas\" width=\"20\" height=\"19\" /> Avisos</p>";
	
	public static String CAB_ERROS="<p><img src=\"images/stop.gif\" alt=\"erro\" /> Erros</p>";
	public static String INI_TABELA_XHTML="<table id=\"tabelaErros2\">"+
	"<tr>"+
		"<td class=\"topo2\"> Linha(s) </td>"+
		"<td class=\"topo2\"> Mensagem</td>"+
	"</tr>";
	/**
	 * Retorna o html do relat�rio de CSS
	 * @param avaliacaoCSS
	 * @param id
	 * @return html
	 */
	public static String getHtml(AvaliacaoCSS avaliacaoCSS,String id) {
		String res = "";
		String cssErros=getTabela(avaliacaoCSS.getErros().getErrors());
		String cssAvisos=getTabela(avaliacaoCSS.getAvisos().getWarnings());
		{
			res += "<div class=\"domtab\" ><ul class=\"domtabs\" ><li class=\"primeiro\"><a href=\"#"+id+"pri1\">Erros</a></li><li><a href=\"#"+id+"pri2\">Avisos</a></li></ul>";
			res += "<div><p class=\"titulo\"><a name=\""+id+"pri1\" id=\""+id+"pri1\"></a></p>" +
				"</p>";		
			{	
				if(!cssErros.equals("")){
					res +=CAB_ERROS;
					res +=INI_TABELA_CSS;
					res +=cssErros;
					res += "</table></div>";
				}else{
					res +="Nenhum erro encontrado.</div>";
				}
				
			}
			res += "<div><p class=\"titulo\"><a name=\""+id+"pri2\" id=\""+id+"pri2\"></a></p>";
			{	
				if(!cssAvisos.equals("")){
					res +=CAB_AVISOS;
					res +=INI_TABELA_CSS;
					res += cssAvisos;
					res += "</table></div>";
				}else{
					res +="Nenhum aviso para ser exibido.</div>";
				}
			}
		}
		res += "</div>";//fecha domtabs
		return res;
	}
	private static String getTabela(Warning[] warnings) {
		StringBuilder sb =new StringBuilder();
		for (Warning warning : warnings) {
			sb.append("<tr><td>");
			sb.append(warning.getLine());
			sb.append("</td><td>");
			sb.append(warning.getWarningMessage());
			sb.append("</td></tr>");
		}
		return sb.toString();
	}
	private static String getTabela(CssError[] errors) {
		StringBuilder sb =new StringBuilder();
		for (CssError cssError : errors) {
			sb.append("<tr><td>");
			sb.append(cssError.getLine());
			sb.append("</td><td>");
			sb.append(cssError.getException().getMessage());
			sb.append("</td></tr>");
		}
		return sb.toString();
	}
	/**
	 * Retorna o html do relat�rio
	 * @param relatorio
	 * @param id
	 * @return html
	 */
	public static String getHtml(RelatorioAcessibilidade relatorio,String id) {
		String res = "";
		String htmlErrosP1=getTabela(relatorio.getListErroP1());
		String htmlErrosP2=getTabela(relatorio.getListErroP2());
		String htmlErrosP3=getTabela(relatorio.getListErroP3());
		String htmlAvisosP1=getTabela(relatorio.getListAvisoP1());
		String htmlAvisosP2=getTabela(relatorio.getListAvisoP2());
		String htmlAvisosP3=getTabela(relatorio.getListAvisoP3());
	
		String htmlErrosXHTML=getTabelaXHTML(relatorio.getListErroXHTML());
		{
			res += "<div class=\"domtab\" ><ul class=\"domtabs\" ><li class=\"primeiro\"><a href=\"#"+id+"pri1\">Prioridade 1</a></li><li><a href=\"#"+id+"pri2\">Prioridade 2</a></li><li><a href=\"#"+id+"pri3\">Prioridade 3</a></li><li><a href=\"#"+id+"pri4\">Erros em HTML</a></li></ul>";
			res += "<div><p class=\"titulo\"><a name=\""+id+"pri1\" id=\""+id+"pri1\">Prioridade 1</a></p>" +
				"Pontos que os criadores de conte&uacute;do Web devem satisfazer inteiramente. Se n&atilde;o o fizerem, um ou mais grupos de usu&aacute;rios ficar&atilde;o impossibilitados de acessar as informa&ccedil;&otilde;es contidas no documento. A satisfa&ccedil;&atilde;o desse tipo de pontos  &eacute; um requisito b&aacute;sico para que determinados grupos possam acessar documentos dispon&iacute;veis na Web."+
				"</p>";		
			{	
				if(!htmlErrosP1.equals("")){
					res +=CAB_ERROS;
					res +=INI_TABELA;
					res +=htmlErrosP1;
					res += "</table>";
				}
				if(!htmlAvisosP1.equals("")){
					res +=CAB_AVISOS;
					res +=INI_TABELA;
					res += htmlAvisosP1;
					res += "</table></div>";
				}
			}
			res += "<div><p class=\"titulo\"><a name=\""+id+"pri2\" id=\""+id+"pri2\">Prioridade 2</a></p>" +
			"Pontos que os criadores de conte&uacute;dos na Web deveriam satisfazer. Se n&atilde;o o fizerem, um ou mais grupos de usu&aacute;rios ter&atilde;o dificuldades em acessar as informa&ccedil;&atilde;es contidas no documento. A satisfa&ccedil;&atilde;o desse tipo de pontos promover&aacute; a remo&ccedil;&atilde;o de barreiras significativas ao acesso a documentos dispon&iacute;veis na Web."
			+"</p>";
			{	
				if(!htmlErrosP2.equals("")){
					res +=CAB_ERROS;
					res +=INI_TABELA;
					res +=htmlErrosP2;
					res += "</table>";
				}
				if(!htmlAvisosP2.equals("")){
					res +=CAB_AVISOS;
					res +=INI_TABELA;
					res += htmlAvisosP2;
					res += "</table></div>";
				}
			}
			res += "<div><p class=\"titulo\"><a name=\""+id+"pri3\" id=\""+id+"pri3\">Prioridade 3</a></p>" +
			"Pontos que os criadores de conte&uacute;dos na Web podem satisfazer. Se n&atilde;o o fizerem, um ou mais grupos poder&atilde;o se deparar com algumas dificuldades em acessar informa&ccedil;&otilde;es contidas nos documentos. A satisfa&ccedil;&atilde;o deste tipo de pontos ir&aacute; melhorar o acesso a documentos armazenados na Web."
			+"</p>";
			{
				if(!htmlErrosP3.equals("")){
					res +=CAB_ERROS;
					res +=INI_TABELA;
					res +=htmlErrosP3;
					res += "</table>";
				}
				if(!htmlAvisosP3.equals("")){
					res +=CAB_AVISOS;
					res +=INI_TABELA;
					res += htmlAvisosP3;
					res += "</table></div>";
				}
			}
		}
		res += "<div><p class=\"titulo\"><a name=\""+id+"pri4\" id=\""+id+"pri4\">Erros em Html</a></p>" +
		"Problemas com a sintaxe html"
		+"</p>";
		{
			if(!htmlErrosXHTML.equals("")){
				res +=CAB_ERROS;
				res +=INI_TABELA_XHTML;
				res +=htmlErrosXHTML;
				res += "</table>";
			}else{
				res +="Nenhum erro para ser exibido.</div>";
			}
		
		}
	
		res += "</div>";//fecha domtabs
		return res;
	}
	/**
	 * Gera a tabela de erros
	 * @param lista
	 * @return html
	 */
	private static String getTabela(List<ErrosRegra> lista) {
		String res="";
		if(lista==null) return "<tr><td></td></tr>";
		for (int j = 0; j < lista.size(); j++) {
			ErrosRegra er = lista.get(j);
			res += "<tr><td class=\"celula\" width=\"2%\">";
			res += er.getCodigo();
			res += "</td><td class=\"celula\" width=\"60%\">";
			res += StringUtils.htmlEntityEncode(er.getTexto());
			res += "</td><td class=\"celula\">";
			res += er.getListOcorrencia().size();
			res += "</td><td class=\"celula\">";
			for (ArmazenaErroOuAviso ea : er.getListOcorrencia()) {
				if (ea.getLinha() > 0) {
					res += ea.getLinha() + ", ";
				}
			}
			res += "</td></tr>";
		}
		return res;
	}
	
	private static String getTabelaXHTML(List<ErrosRegra> lista) {
		String res="";
		if(lista==null) return "<tr><td></td></tr>";
		for (int j = 0; j < lista.size(); j++) {
			ErrosRegra er = lista.get(j);
			res += "<tr><td class=\"celula\" >";
			res += er.getListOcorrencia().get(0).getLinha();
			res += "</td><td class=\"celula\" >";
			res += StringUtils.htmlEntityEncode(er.getTexto());
			res += "</td></tr>";
		}
		return res;
	}
}
